
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stm32f10x.h>

#include "delay.h"
#include "usart.h"
#include "timer.h"
#include "DHT11.h"
#include "MatrixKey.h"
#include "Motor.h"
#include "WaterPump.h"
#include "SYN6288.h"
#include "ESP8266.h"

void Hardware_Init(void);
void Variable_Init(void);
void Motor_Water_Pump_Control(void);

uint8_t Temperature;
uint8_t Humidity;
int WorkTime;
int PowerSwitch; // 水泵开关

u32 cnt;
u32 KeyNum;
int MotorSwitch; // 步进电机开关

int main(void)
{
	// 初始化硬件
	Hardware_Init();
	// 初始化变量
	Variable_Init();
	while (1)
	{
		KeyNum = MatrixKey_GetValue();
		if (KeyNum == 1)
		{
			WorkTime = Set_Time();
#if DEBUG
			UsartPrintf(USART_DEBUG, "KeyNum=%d\r\n", WorkTime);
#endif
		}
		cnt++;
		if (cnt % 100 == 0) // 每一秒采集一次数据
		{
			DHT11_Read_Data(&Temperature, &Humidity); // 约每1s执行一次温湿度采集
#if DEBUG
			UsartPrintf(USART_DEBUG, "Temperature=%d,Humidity=%d\r\n", Temperature, Humidity);
#endif
		}
		if (cnt % 500 == 0) // 每5秒进行一次数据上报
		{
			if (ESP8266_SendData())
			{
#if DEBUG
				UsartPrintf(USART_DEBUG, "Send Faile\r\n");
#endif
			}
			else
			{
#if DEBUG
				UsartPrintf(USART_DEBUG, "Send Success\r\n");
#endif
			}
			cnt = 0;
		}
		if (strstr(ESP8266_RX_BUFF, "/sys/k0brbe2WP8y/ESP_DEV/thing/service/property/set") != NULL)
		{
#if DEBUG
			UsartPrintf(USART_DEBUG, "CommandAnalyse\r\n");
#endif
			CommandAnalyse();
		}
		Motor_Water_Pump_Control();
		delay_ms(10);
	}
}

void Hardware_Init(void)
{
	// 中断控制器分组设置
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	// 延时初始化
	delay_Init();
	// 串口1初始化
	Usart1_Init(9600);
	// 串口3初始化
	Usart3_Init(115200);
	// 定时器2初始化
	Init_Tim2();
	// 定时器3初始化
	Init_Tim3();
	// 初始化DHT11
	while (DHT11_Init())
	{
#if DEBUG
		UsartPrintf(USART_DEBUG, "DHT11 Error \r\n");

#endif
		delay_ms(1000);
	}
	// 初始化ESP8266
	ESP8266_Init();
	// 初始化矩阵按键
	MatrixKey_Init();
	// 初始化电机
	Motor_Init();
	// 初始化水泵
	Water_Pump_Init();
#if DEBUG
	UsartPrintf(USART_DEBUG, "Hardware init OK\r\n");
#endif
}
/// @brief 变量初始化
/// @param
void Variable_Init(void)
{
	Temperature = 0;
	Humidity = 0;
	WorkTime = -1;
	PowerSwitch = 0; // 水泵开关
	MotorSwitch = 0; // 步进电机开关
	cnt = 0;
	KeyNum = 0;
}
void Motor_Water_Pump_Control(void)
{
	if (MotorSwitch == 1)
	{
		int i;
		for (i = 0; i <= (8 * 64); i++)
		{
			// Motor_One(5);
			// Motor_two(5);
			Motor_one_two(1);
		}
		// SYN_("[d][v7][m2][t5][y0][x1][o0]");
		// delay_ms(1000);
		// SYN_("happy");
		Speech();
		MotorSwitch = 0;
	}
	if (PowerSwitch == 1)
	{
		Water_Pump_On();
		PowerSwitch = 0;
		cnt = 499;
	}
}

/* 定时器2中断函数*/
void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{
		if (WorkTime > 0)
		{
			WorkTime--;
#if DEBUG
			UsartPrintf(USART_DEBUG, "WorkTime=%d\r\n", WorkTime);
#endif
			if (WorkTime == 0) // 启动步进电机
			{
				MotorSwitch = 1;
				WorkTime = -1;
				PowerSwitch = 1;
			}
		}
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}

